<?php
/**
 * @link https://www.kancloud.cn/cleverstone/ymb2
 * @copyright Copyright (c) 2020 Yii Manager Software LLC
 */

namespace builder\tree_table\util\ttthead;

use builder\helper\Str;
use yii\helpers\Html;

/**
 * 普通列选项
 * @author cleverstone
 * @since ym2.0
 */
class Field extends TheadColumnOption
{
    /**
     * @var array
     */
    private $_options = [
        'type' => '__field',// 列类型
        'field' => '',      // 列字段
        'title' => '',      // 表格标题
        'help' => '',       // 列帮助提示
        'width' => null,    // 当前列宽度
        'minWidth' => 60,   // 当前列的最小宽度
        'maxWidth' => 0,    // 当前列的最大宽度
        'style' => '',      // 单元格样式
        'align' => 'left',  // 单元格排列方式
        'sort' => 0,        // 是否开启列的排序功能
        'totalRow' => false,// 开启前端行合计
        // --- 单元格编辑选项 start ----
        'edit' => false,    // 用于对列所在的单元格开启编辑功能。可选值有：text, textarea , false
        'ctrlField' => '',  // 控制字段, 当edit不为false时生效, 用于edit功能开关控制
        'route' => '',      // 路由, 当edit不为false时生效, 用于内容提交
        'params' => [],     // 路由参数, 当edit不为false时生效, 用于内容提交
        'afterEditedCallback' => 0, //编辑成功后, 是否回调刷新页面
        // --- 单元格编辑选项 end   ----
    ];

    /**
     * Field constructor.
     * @param $field
     */
    public function __construct($field)
    {
        if (!strcasecmp($field, 'id')) {
            $this->_options['width'] = 80;
        }
        $this->_options['field'] = $field;
    }

    /**
     * @param string $title 列标题
     * @return $this
     */
    public function title($title)
    {
        $this->_options['title'] = Str::escapeCRLF((string)$title);
        return $this;
    }

    /**
     * @param string $help 列帮助提示语
     * @return $this
     */
    public function help($help)
    {
        $this->_options['help'] = (string)Html::encode($help);
        return $this;
    }

    /**
     * @param string|int $width 单元格宽度, 支持数字和百分比
     * @return $this
     */
    public function width($width)
    {
        $this->_options['width'] = $width;
        return $this;
    }

    /**
     * @param int $minWidth 最小宽度
     * @return $this
     */
    public function minWidth($minWidth)
    {
        $this->_options['minWidth'] = (int)$minWidth;
        return $this;
    }

    /**
     * @param int $maxWidth 最大宽度
     * @return $this
     */
    public function maxWidth($maxWidth)
    {
        $this->_options['maxWidth'] = (int)$maxWidth;
        return $this;
    }

    /**
     * @param array|string $style 单元格样式
     * @return $this
     */
    public function style($style)
    {
        $this->_options['style'] = $style;
        return $this;
    }

    /**
     * 单元格居中排列
     * @return $this
     */
    public function alignCenter()
    {
        $this->_options['align'] = 'center';
        return $this;
    }

    /**
     * 单元格居右排列
     * @return $this
     */
    public function alignRight()
    {
        $this->_options['align'] = 'right';
        return $this;
    }

    /**
     * 列排序
     * @return $this
     */
    public function sort()
    {
        $this->_options['sort'] = 1;
        return $this;
    }

    /**
     * 开启前端行合计(需要通过setOpenTotalRow开启)
     * @return $this
     */
    public function totalRow()
    {
        $this->_options['totalRow'] = true;
        return $this;
    }

    /**
     * 单元格编辑(text)
     * @param string $route 路由
     * @param string $ctrlField 控制字段
     * @param array $params 路由参数
     * 支持的路由参数形式
     * - ['field']
     * - ['field' => 1]
     * - ['field' => ':field2']
     *
     * @return $this
     */
    public function editText($route, $ctrlField = '', array $params = [])
    {
        $this->_options['edit'] = 'text';
        $this->_options['ctrlField'] = $ctrlField;
        $this->_options['route'] = $route;
        $this->_options['params'] = $params;

        return $this;
    }

    /**
     * 当单元格编辑生效时, 编辑成功后刷新列表
     * @return $this
     */
    public function editedCallbackRefresh()
    {
        if ($this->_options['edit']) {
            $this->_options['afterEditedCallback'] = 1;
        }

        return $this;
    }

    /**
     * 单元格编辑(textarea)
     * @param string $route 路由
     * @param string $ctrlField 控制字段
     * @param array $params 路由参数
     * 支持的路由参数形式
     * - ['field']
     * - ['field' => 1]
     * - ['field' => ':field2']
     *
     * @return $this
     */
    public function editTextarea($route, $ctrlField = '', array $params = [])
    {
        $this->_options['edit'] = 'textarea';
        $this->_options['ctrlField'] = $ctrlField;
        $this->_options['route'] = $route;
        $this->_options['params'] = $params;

        return $this;
    }

    /**
     * @return array
     */
    public function _toArray()
    {
        $option = $this->_options;
        if (!empty($option['edit'])) { // 检查是否开启单元格编辑
            if (!$this->checkAccess($option['route'])) { // 路由权限检查失败
                // 关闭单元格编辑
                $option['edit'] = false;
            } else {
                $option['title'] = Str::escapeCRLF('<i class="bi bi-pen text-primary f12"></i>&nbsp;') . $option['title'];
            }
        }

        return $option;
    }
}